//------------------------------------------------------------------------
//    Copyright (C) 2009-2010  INSA de Lyon
//
//    This software was written by the SCOR Team, INSA de Lyon (France).
//    Contact: Jennifer RENOUX  <renoux.jennifer@gmail.com>
//
//    This file is part of SCOR-Khepera.
//
//    SCOR-Khepera is free software: you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation, either version 3 of the License, or
//    (at your option) any later version.
//
//    SCOR-Khepera is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//    GNU General Public License for more details.
//
//    You should have received a copy of the GNU General Public License
//    along with SCOR-Khepera.  If not, see <http://www.gnu.org/licenses/>.
//------------------------------------------------------------------------

#ifndef ACQUISITION_OUTILS_H
#define ACQUISITION_OUTILS_H

#include <cv.h>
#include <highgui.h>

// Orientation des lignes et position du terrain
typedef enum { HAUT=0, BAS=1, GAUCHE=2, DROITE=3, AUCUN=-1}orientationObjet;

// Savoir si une ligne a été trouvée ou non
typedef enum { OK, KO} resultatObjet;
// Récupérer un objet trouvé : son centre, sa taille
typedef struct positionRectangle
{
	CvPoint center;
	int width;
	int height;
} positionRectangle;
// Récupérer une ligne en coordonnées polaires
typedef struct ligneThetaRho
{
	float rho;
	float theta;
	resultatObjet trouve;
} ligneThetaRho;
typedef struct lignePoint12
{
	CvPoint pt1;
	CvPoint pt2;
} lignePoint12;

// Noms des fenetres utilisées
#define wdnbrg			"brg"			
#define wdnbords		"bords"		
#define wdnperspective	"perspective"	
#define wdnmotionbleu	"motion bleu"	
#define wdnmotionrouge	"motion rouge"
#define wdnresultbleu	"result bleu"	
#define wdnresultrouge	"result rouge"
#define wdnresultvert	"result vert"	
#define wdnvert			"vert"		
#define wdnvertdilate	"vert dilate"	
#define wdnvertcvcanny	"vert cvCanny"
#define wdnvertlimites	"vert limites"
#define wdndistorsion	"vert distort"

// Tailles détectées, en pixel
#define TAILLE_MIN_BALLE	 5
#define TAILLE_MAX_BALLE	50
#define TAILLE_MIN_KHEPERA	 5
#define TAILLE_MAX_KHEPERA	50

// Fonctions de traitement
void  update_mhi( IplImage* img, IplImage* dst, int diff_threshold, 
						int tailleMin, int tailleMax, positionRectangle rectangles[], int* nbObjets, int nbmaxObjets);
int traiterrouge(IplImage* hsvFrame);
int traitervert(IplImage* hsvFrame);
int traiterbleu (IplImage* hsvFrame);

//Fonctions de création et destruction des fenetres
void creerfenetreslimites(int option);
void creerfenetresperspective(int option);
void creerfenetres(int option);
void detruirefenetreslimites();
void detruirefenetresperspective();
void detruirefenetres();

// Fonctions utilisées pour les calculs "mathématiques"
float distancecarre(positionRectangle obj1, positionRectangle obj2);
int trouverunelimite(ligneThetaRho lignes[], int nbLignes, orientationObjet orientation, int lignedejautilisee);
void calculintersection(ligneThetaRho ligne1, ligneThetaRho ligne2, CvPoint* croisement);
void tracerligne(IplImage* image, ligneThetaRho* ligne, CvScalar* color);
int trouvermatriceperspective(CvPoint2D32f pts_input[], CvPoint2D32f pts_output[], CvMat* mmat);
int arrangerimage(IplImage* image_input, IplImage* image_output, CvMat* mmat);

#endif
